#include <stdio.h>
#include "acllib.h"

void mouseListener(int x, int y, int button, int event)
{
    // 定义静态变量，防止每次都从 (0, 0) 开始画
    static int ox = 0;
    static int oy = 0;
    static draw = 0;
    printf("x-%d, y-%d, buton-%d, event-%d\n", x, y, button, event);
    beginPaint();
    // 处理按键事件
    if (button == LEFT_BUTTON && event == BUTTON_DOWN)
    {
        draw = 1;
    }
    else if (button == LEFT_BUTTON && event == BUTTON_UP)
    {
        draw = 0;
    }
    else if (button == RIGHT_BUTTON && event == BUTTON_DOWN)
    {
        draw = 1;
        setPenColor(RED);
    }
    else if (button == RIGHT_BUTTON && event == BUTTON_UP)
    {
        draw = 0;
        setPenColor(BLACK);
    }

    if (draw)
    {
        line(ox, oy, x, y);
    }
    endPaint();
    ox = x;
    oy = y;
}

// 键盘回调
void keyListener(int key, int event)
{
    printf("key=%d, event = %d\n", key, event);
}

// 定时器
void timerListener(int id)
{
    // 所有计时器会共享这个 cnt
    static int cnt = 0;
    printf("id : %d, cnt : %d\n", id, cnt);
    if (1)
    {
        cnt++;
        if (cnt > 10)
        {
            cancelTimer(id);
        }
    }
}

int Setup()
{
    initWindow("Test", DEFAULT, DEFAULT, 800, 600);
    initConsole();
    printf("Hello\n");

    int x;
    // 在输入时，程序会停止，这时绘图窗口会显示无响应
    scanf_s("%d", &x);

    // 回调函数
    // 当鼠标移动时在 registerMouseEvent 中寻找相应的函数
    registerMouseEvent(mouseListener);
    // 键盘回调
    registerKeyboardEvent(keyListener);
    // 计时器回调
    registerTimerEvent(timerListener);

    // 0 号计时器，500ms 启动一次
    startTimer(0, 500);
    startTimer(1, 1000);

    // The Callbacks
    // typedef void(*KeyboardEventCallback) (int key, int event);
    // typedef void(*CharEventCallback) (char c);
    // typedef void(*MouseEventCallback) (int x, int y, int button, int event);
    // typedef void(*TimerEventCallback) (int timerID);

    beginPaint();

    line(10, 10, 100, 100);
    line(100, 100, x, 0);

    endPaint();

    // 开始程序后，会进入 WinMain()
    // WinMain() 中会执行 Setup()
    // 之后进入一个 loop
    // 遇到事件后，就会调用相应的回调函数，执行完后再回到 loop
    // 回调函数不能设置无限循环，否则会导致程序无法关闭，也不能执行其他任务
    // （因为关闭程序（按红叉叉）也在 loop 里调用）
    return 0;
}